NHibernate এর Event System একটি শক্তিশালী বৈশিষ্ট্য যা ডোমেইন অবজেক্টের উপর নির্দিষ্ট কার্যক্রম (events) সঞ্চালিত হতে সাহায্য করে। এর মাধ্যমে আপনি কিছু নির্দিষ্ট কার্যক্রম বা অপারেশন সম্পাদন করার পূর্বে বা পরে নিজস্ব কোড কার্যকরী করতে পারেন, যেমন অবজেক্ট সেভ (save), আপডেট (update), ডিলিট (delete) বা লোড (load) করা। এটি মূলত ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করার সময় আরও কাস্টম লজিক ইনজেক্ট করার সুযোগ দেয়।
Event System কীভাবে কাজ করে?
NHibernate Event System এর মাধ্যমে আপনি ইভেন্টগুলিকে হুক করতে পারেন, যেগুলি নির্দিষ্ট অবস্থা বা অপারেশনের সময় কার্যকর হয়। ইভেন্টগুলো সাধারণত ট্রান্সাকশনাল অপারেশনের সাথে সম্পর্কিত হয়, যেমন:
- Pre-Insert: অবজেক্টটি ডেটাবেসে ইনসার্ট করার আগে।
- Post-Insert: অবজেক্টটি ডেটাবেসে ইনসার্ট হওয়ার পরে।
- Pre-Update: অবজেক্টটি আপডেট হওয়ার আগে।
- Post-Update: অবজেক্টটি আপডেট হওয়ার পরে।
- Pre-Delete: অবজেক্টটি ডিলিট হওয়ার আগে।
- Post-Delete: অবজেক্টটি ডিলিট হওয়ার পরে।
- Load: অবজেক্ট লোড করার সময়।
এছাড়া, Flush এবং Persist ইভেন্টগুলোও সমর্থিত।
1. Event Listener এবং Event Handler
NHibernate এর ইভেন্ট সিস্টেমে মূলত দুটি উপাদান ব্যবহৃত হয়:
- Event Listener: এটি একটি ক্লাস যা ইভেন্ট হ্যান্ডলিংয়ের জন্য তৈরি করা হয়। আপনি যেকোনো নির্দিষ্ট ইভেন্টের জন্য একটি লিসেনার তৈরি করতে পারেন।
- Event Handler: এটি নির্দিষ্ট ইভেন্টকে প্রক্রিয়া করতে সহায়তা করে। যখন নির্দিষ্ট ইভেন্ট ঘটে, তখন হ্যান্ডলার সেই ইভেন্টটিকে প্রক্রিয়া করবে।
2. Event Types
NHibernate অনেক ধরনের ইভেন্ট প্রদান করে, যা বিভিন্ন সময় ও অবস্থায় কার্যকর হতে পারে। প্রধান ইভেন্ট টাইপগুলো হলো:
Pre-Insert
এটি তখন ঘটে যখন একটি অবজেক্ট ডেটাবেসে সেভ করা হবে, কিন্তু সেভ হওয়ার আগেই আপনি কিছু কাস্টম লজিক প্রয়োগ করতে পারেন।
public class MyEntityListener : IPreInsertEventListener
{
public void OnPreInsert(PreInsertEvent e)
{
// কিছু কাস্টম লজিক এখানে যুক্ত করা যাবে
}
}
Post-Insert
এটি তখন ঘটে যখন একটি অবজেক্ট ডেটাবেসে সফলভাবে সেভ হয়ে যাবে।
public class MyEntityListener : IPostInsertEventListener
{
public void OnPostInsert(PostInsertEvent e)
{
// সেভ হওয়ার পর কিছু কার্যক্রম পরিচালনা
}
}
Pre-Update
এটি তখন ঘটে যখন অবজেক্টটি আপডেট করার পূর্বে কাস্টম লজিক প্রয়োগ করতে চান।
public class MyEntityListener : IPreUpdateEventListener
{
public void OnPreUpdate(PreUpdateEvent e)
{
// আপডেট হওয়ার আগে কিছু কাস্টম কার্যক্রম
}
}
Post-Update
এটি তখন ঘটে যখন অবজেক্টটি সফলভাবে আপডেট হয়।
public class MyEntityListener : IPostUpdateEventListener
{
public void OnPostUpdate(PostUpdateEvent e)
{
// আপডেট হওয়ার পর কার্যক্রম
}
}
Pre-Delete
এটি তখন ঘটে যখন অবজেক্টটি ডিলিট করার আগে।
public class MyEntityListener : IPreDeleteEventListener
{
public void OnPreDelete(PreDeleteEvent e)
{
// ডিলিট হওয়ার আগে কিছু কাস্টম কার্যক্রম
}
}
Post-Delete
এটি তখন ঘটে যখন অবজেক্টটি সফলভাবে ডিলিট হয়।
public class MyEntityListener : IPostDeleteEventListener
{
public void OnPostDelete(PostDeleteEvent e)
{
// ডিলিট হওয়ার পর কার্যক্রম
}
}
Load
এটি তখন ঘটে যখন অবজেক্টটি ডেটাবেস থেকে লোড হয়।
public class MyEntityListener : ILoadEventListener
{
public void OnLoad(LoadEvent e)
{
// লোড হওয়ার পর কিছু কার্যক্রম
}
}
3. ইভেন্ট লিসেনার রেজিস্টার করা
একবার আপনি ইভেন্ট হ্যান্ডলার তৈরি করলে, আপনাকে সেগুলি NHibernate কনফিগারেশন ফাইলে বা কোডে রেজিস্টার করতে হবে।
কনফিগারেশনে ইভেন্ট লিসেনার রেজিস্টার করা
var cfg = new Configuration();
cfg.Configure(); // Default configuration
cfg.EventListeners.PreInsertEventListeners = new IPreInsertEventListener[] { new MyEntityListener() };
cfg.EventListeners.PostInsertEventListeners = new IPostInsertEventListener[] { new MyEntityListener() };
// অন্যান্য ইভেন্ট লিসেনার রেজিস্টার করুন
এভাবে আপনি বিভিন্ন ইভেন্টের জন্য হ্যান্ডলারের ইনস্ট্যান্স রেজিস্টার করতে পারেন।
Fluent NHibernate ব্যবহার করে ইভেন্ট রেজিস্টার
Fluent NHibernate ব্যবহার করেও ইভেন্ট লিসেনার রেজিস্টার করা যায়:
FluentConfiguration fcfg = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString("your_connection_string"))
.ExposeConfiguration(cfg =>
{
cfg.EventListeners.PreInsertEventListeners = new IPreInsertEventListener[] { new MyEntityListener() };
cfg.EventListeners.PostInsertEventListeners = new IPostInsertEventListener[] { new MyEntityListener() };
// অন্যান্য ইভেন্ট লিসেনার রেজিস্টার করুন
})
.BuildSessionFactory();
4. কাস্টম ইভেন্ট লিসেনারের সুবিধা
NHibernate Event System এর মাধ্যমে আপনি নিম্নলিখিত সুবিধা পেতে পারেন:
- Audit Logs: ডেটাবেসে সেভ, আপডেট, বা ডিলিট অপারেশনের সময় অডিট লগ রাখা।
- Validation: অবজেক্ট সেভ বা আপডেট হওয়ার আগে কাস্টম ভ্যালিডেশন করা।
- Security Checks: ডেটাবেসে কোনো ডিলিট বা আপডেট করার আগে নিরাপত্তা চেক করা।
- Triggering Other Actions: এক অপারেশনের পর অন্য কোনো কার্যক্রম চালানো (যেমন: ক্যাশে আপডেট, ইমেইল পাঠানো, ইত্যাদি)।
সারাংশ
NHibernate Event System আপনাকে আপনার ডোমেইন মডেল এবং ডেটাবেস অপারেশনের মধ্যে কাস্টম লজিক প্রয়োগ করতে সহায়তা করে। এর মাধ্যমে আপনি সেভ, আপডেট, ডিলিট, এবং লোড ইভেন্টের সময় নির্দিষ্ট কাজ করতে পারবেন, যা ডেটাবেস অপারেশনের আরও নিয়ন্ত্রণ এবং কর্মক্ষমতা নিশ্চিত করে।
Read more